/**
 * 上传文件项的状态
 *
 * @format
 */

export type UploadStatus = 'ready' | 'uploading' | 'success' | 'error';

/**
 * 上传方法类型
 */
export type UploadMethod = 'form' | 'base64';

/**
 * 上传文件项
 */
export interface UploadFile {
  /** 文件唯一标识 */
  uid: string;
  /** 文件名称 */
  name: string;
  /** 文件大小（字节） */
  size: number;
  /** 文件类型 */
  type: string;
  /** 上传状态 */
  status: UploadStatus;
  /** 上传进度（0-100） */
  progress: number;
  /** 文件URL（预览用） */
  url?: string;
  /** 文件路径（本地临时路径） */
  path?: string;
  /** 上传响应数据 */
  response?: any;
  /** 上传错误信息 */
  error?: string;
  /** 原始文件对象 */
  raw?:
    | {
        /** 原始File对象（H5平台） */
        file?: File;
        /** 其他平台特有属性 */
        [key: string]: any;
      }
    | any;
}

/**
 * 上传组件Props
 */
export interface UploadProps {
  /** 上传的文件列表 */
  modelValue: UploadFile[];
  /** 上传的地址 */
  action: string;
  /** 设置上传的请求头部 */
  headers?: Record<string, string>;
  /** 上传时附带的额外参数 */
  data?: Record<string, any>;
  /** 上传的文件字段名 */
  name?: string;
  /** 是否支持多选文件 */
  multiple?: boolean;
  /** 是否在选取文件后立即进行上传 */
  autoUpload?: boolean;
  /** 接受上传的文件类型 */
  accept?: string;
  /** 文件大小限制，单位为字节 */
  maxSize?: number;
  /** 最大允许上传文件数量 */
  limit?: number;
  /** 是否禁用 */
  disabled?: boolean;
  /** 上传按钮文字 */
  buttonText?: string;
  /** 上传方法 */
  uploadMethod?: UploadMethod;
  /** 是否显示文件列表 */
  showFileList?: boolean;
  /** 是否显示上传进度 */
  showProgress?: boolean;
  /** 列表的类型 */
  listType?: 'text' | 'picture' | 'picture-card';
  /** 上传请求超时时间 */
  timeout?: number;
}

/**
 * 上传组件事件
 */
export interface UploadEvents {
  /** 文件状态改变时的钩子 */
  change: (file: UploadFile, fileList: UploadFile[]) => void;
  /** 文件上传成功时的钩子 */
  success: (response: any, file: UploadFile, fileList: UploadFile[]) => void;
  /** 文件上传失败时的钩子 */
  error: (error: any, file: UploadFile, fileList: UploadFile[]) => void;
  /** 文件上传进度变化时的钩子 */
  progress: (event: any, file: UploadFile, fileList: UploadFile[]) => void;
  /** 文件超出个数限制时的钩子 */
  exceed: (files: any[], fileList: UploadFile[]) => void;
  /** 删除文件时的钩子 */
  remove: (file: UploadFile, fileList: UploadFile[]) => void;
  /** 点击文件列表中已上传的文件时的钩子 */
  preview: (file: UploadFile) => void;
}

/**
 * 上传组件方法
 */
export interface UploadMethods {
  /** 手动上传文件列表 */
  submitUpload: () => void;
  /** 清空已上传的文件列表 */
  clearFiles: () => void;
  /** 取消上传请求 */
  abort: (file?: UploadFile) => void;
}
